/* Copyright (c) 2015,2016 Lucky Byte, Inc.
 */
package com.lucky_byte.pay.jar;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class ByteUtils
{
	private static final Logger logger = LogManager.getLogger();

	/**
	 * 取数组的一部分
	 *
	 * @param bytes 数组
	 * @param offset 起始偏移
	 * @param length 要截取的长度
	 * @return 新分配的数组
	 */
	public static byte[] truncate(byte[] bytes, int offset, int length) {
		if (bytes == null || length == 0) {
			logger.error("截断byte数组参数错误.");
			return null;
		}
		if (offset + length > bytes.length) {
			logger.error("截断byte数组的偏移和长度[{}]超出范围[{}].",
					offset + length, bytes.length);
			return null;
		}
		byte[] result = new byte[length];
		for (int i = 0; i < length; i++) {
			result[i] = bytes[offset + i];
		}
		return result;
	}

	/**
	 * 判断两个 byte 数组是否相等，相等意味着长度相同，内容相同
	 *
	 * @param b1 数组 1
	 * @param b2 数组 2
	 * @return 是否相等
	 */
	public static boolean equels(byte[] b1, byte[] b2) {
		if (b1.length != b2.length) {
			return false;
		}
		for (int i = 0; i < b1.length; i++) {
			if (b1[i] != b2[i]) {
				return false;
			}
		}
		return true;
	}

	/**
	 * 连接 2 个 byte 数组
	 *
	 * @param b1 第一个数组
	 * @param b2 第二个数组
	 * @return 连接后新分配的数组
	 */
	public static byte[] concat(byte[] b1, byte[] b2) {
		if (b1 == null || b2 == null) {
			logger.error("连接 byte[] 数组参数为空.");
			return null;
		}
		byte[] result = new byte[b1.length + b2.length];
		for (int i = 0; i < b1.length; i++) {
			result[i] = b1[i];
		}
		for (int j = 0, i = b1.length; j < b2.length; j++, i++) {
			result[i] = b2[j];
		}
		return result;
	}

	/**
	 * 格式化显示二进制数据
	 */
	public static String format(byte[] bytes, int offset, int length) {
		if (bytes == null) {
			return null;
		}
		StringBuilder builder = new StringBuilder("");
		if (length <= 0) {
			length = bytes.length;
		}
		for (int i = offset, j = 1; i < length; i++, j++) {
			builder.append(String.format("%02X", bytes[i]));
			if (j % 24 == 0) {
				builder.append("\n");
			} else if (j % 8 == 0) {
				builder.append("   ");
			} else if (i < length) {
				builder.append(" ");
			}
		}
		return builder.toString().trim();
	}

	/**
	 * 上面函数的简化版本
	 */
	public static String format(byte[] bytes) {
		return format(bytes, 0, -1);
	}

	/**
	 * 格式化报文数据，并记录到日志中
	 *
	 * @param prefix 输出前缀字符串
	 * @param bytes 输出的字节流
	 * @param length 字节流长度
	 */
	public static void log(String prefix, byte[] bytes,
			int offset, int length) {
		logger.trace("{}\n{}", prefix, format(bytes, offset, length));
	}

	public static void log(String prefix, byte[] bytes, int length) {
		log(prefix, bytes, 0, length);
	}

	public static void log(String prefix, byte[] bytes) {
		log(prefix, bytes, 0, -1);
	}
}
